package ch.gibb.learnit.client.controllers;

import ch.gibb.learnit.client.util.soap.Category;
import ch.gibb.learnit.client.util.soap.Word;
import org.apache.log4j.Logger;

import java.util.ArrayList;
import java.util.List;

/**
 * Controller to manage the words
 *
 * @author Bernard Jaquet
 * @version 1.0
 */
public class ManageAction extends MasterAction {

    //OUT
    private List<Word> words;
    private Word selectedWord;
    private List<Category> userCategorys;

    //IN
    private String form;
    private String wordId;
    private String newQuestion;
    private String newAnswer;
    private String newCategoryId;
    private String newWordId;

    //Class
    private final Logger masterLogger = Logger.getLogger(ManageAction.class);

    @Override
    public int openPage() {
        // Sets the title of the page
        super.title = "Verwaltung";


        // Checks if a user is logged in
        if (!loginCheck())
            return 403;

        masterLogger.debug("wordId is " + wordId);

        // Gets the word and the categories for the active user
        try {
            words = client.getAllWords(getUser());
            userCategorys = client.getCategories(getUser());
            if (words == null || userCategorys == null) {
                getErrors().addMessage("Benutzerdaten konnten wegen eines internen Fehlers nicht geladeb werden");
                return 0;
            }
        } catch (Exception e) {
            getErrors().addMessage("Die Lernkarten konnten wegen eines internen Fehlers nicht geladen werden");
            masterLogger.error("Could not get Word because " + e.getMessage(), e);
        }

        // Remove the selected word
        if (form != null && form.equals("Entfernen")) {
            try {
                if (wordId == null)
                    return 0;
                List<Word> list = new ArrayList<Word>();
                list.add(client.getWord(getUser(), Integer.valueOf(wordId)));
                if (client.removeWords(getUser(), list))
                    getSuccess().addMessage("Lernkarte wurde entfernt");
                else {
                    getErrors().addMessage("Wegen eines internen Fehlers konnte die Lerkarte nicht gelöscht werden");
                    return 0;
                }
                words = client.getAllWords(getUser());
                if(words == null) {
                    getErrors().addMessage("Die Lernkarten konnten wegen eines internen Fehlers nicht geladen werden");
                }
            } catch (NumberFormatException e) {
                getErrors().addMessage("Die Lernkarte konnte wegen eines internen Fehlers nicht entfernt werden");
                masterLogger.error("Could not delete Word because " + e.getMessage(), e);
            }
        }

        // Opens the change page for the change on words
        if (form != null && form.equals("Bearbeiten")) {
            if (wordId == null)
                return 0;
            selectedWord = client.getWord(getUser(), Integer.valueOf(wordId));
            words = client.getAllWords(getUser());
            if(selectedWord == null || words == null){
                getErrors().addMessage("Wegen eines internen Fehlers kann die Lernkarte nicht bearbeitet werden");
                return 0;
            }
            return 1;
        }

        // Toggles the activity of the words
        if (form != null && form.equals("Aktivieren / Deaktivieren")) {
            if (wordId == null)
                return 0;
            Word w = client.getWord(getUser(), Integer.valueOf(wordId));
            w.setActive(!w.isActive());
            if(client.updateWord(getUser(), factory.createCategory(), w))
                getSuccess().addMessage("Der Status der Lernkarte ist neu gesetzt");
            else {
                getErrors().addMessage("Wegen eines internen Fehlers konnte der Status der Lernkarte nicht neu gesetzt werden");
            }
            words = client.getAllWords(getUser());
            if(words == null) {
                getErrors().addMessage("Die Lernkarten konnten wegen eines internen Fehlers nicht geladen werden");
                return 0;
            }
        }

        // Saves the change at the word
        if (form != null && form.equals("Speichern")) {
            Word w = client.getWord(getUser(), Integer.valueOf(newWordId));
            w.setQ(factory.createWordQ(newQuestion));
            w.setA(factory.createWordA(newAnswer));
            if(client.updateWord(getUser(), client.getCategory(getUser(), Integer.valueOf(newCategoryId)), w))
                getSuccess().addMessage("Die Lernkarte wurde erfolgreich aktualisiert");
            else {
                getErrors().addMessage("Wegen eines internen Fehlers konnte die Lernkarte nicht aktualisiert werden");
            }
            words = client.getAllWords(getUser());
            if(words == null) {
                getErrors().addMessage("Die Lernkarten konnten wegen eines internen Fehlers nicht geladen werden");
                return 0;
            }
        }

        return 0;
    }

    public List<Word> getWords() {
        return words;
    }

    public void setWords(List<Word> words) {
        this.words = words;
    }

    public String getForm() {
        return form;
    }

    public void setForm(String form) {
        this.form = form;
    }

    public String getWordId() {
        return wordId;
    }

    public void setWordId(String wordId) {
        this.wordId = wordId;
    }

    public Word getSelectedWord() {
        return selectedWord;
    }

    public void setSelectedWord(Word selectedWord) {
        this.selectedWord = selectedWord;
    }

    public String getNewQuestion() {
        return newQuestion;
    }

    public void setNewQuestion(String newQuestion) {
        this.newQuestion = newQuestion;
    }

    public String getNewAnswer() {
        return newAnswer;
    }

    public void setNewAnswer(String newAnswer) {
        this.newAnswer = newAnswer;
    }

    public String getNewCategoryId() {
        return newCategoryId;
    }

    public void setNewCategoryId(String newCategoryId) {
        this.newCategoryId = newCategoryId;
    }

    public String getNewWordId() {
        return newWordId;
    }

    public void setNewWordId(String newWordId) {
        this.newWordId = newWordId;
    }

    public List<Category> getUserCategorys() {
        return userCategorys;
    }

    public void setUserCategorys(List<Category> userCategorys) {
        this.userCategorys = userCategorys;
    }
}
